Asset bundles cannot include Editor Objects とは一体【解決済み】
概要
UnityでのAssetBundleづくり、コマンドラインからAssetBundle作るところで、
めったに出くわさない気がするエラーに出会った。
原因が知りたいな。
全文
Asset bundles cannot include Editor Objects (Prefab): Assets/AssetRails/temp/Resources/prefabricate/chara/idol_01/prefabricated.prefab.
前提とタイミング
コマンドラインからジョブをくみ上げられるようなものを作っていて、
prefab作成→AssetBundle作成 時に発生した。
作成したprefab自体には問題ないが、そのまま作成したprefabを使用してAssetBundleすると怒られる。
発生するのは、BuildPipeline.BuildAssetBundle メソッド実行時。
回避方法
回避方法はある。
prefab作成、AssetBundle作成ともに、Unityをコマンドラインから使用して動かしているので、コマンドを分けたところ、発生しなくなる。
Unity.exe prefab作成コマンド + AssetBundle作成コマンド -> 失敗
Unity.exe prefab作成コマンド 終了後、Unity.exe AssetBundle作成コマンド -> 成功
このエラーについての情報が集まれば、エレガントに仕留められると思うんだけど。。
助けてだれか、、!
予測
Unity.appの終了時にしか発生しないイベント、みたいなやつがあって、作成したprefabをどうにかしてるのかなーって思っている。
解決編
Unityのお問い合わせにサンプルプロジェクト込みでぶん投げたら、恐ろしい速さで返答をいただいた。
ちなみにサンプルプロジェクトは依存解決に一個失敗してたんだけどな、、、!
Asset bundles cannot include Editor Objects (Prefab): Assets/AssetRails/temp/Resources/prefabricate/chara/idol_01/prefabricated.prefab.
が何を言いたいエラーなのかの説明ももらった。満足だ。
Asset bundles cannot include Editor Objects とは一体
Unity Japanの中の人いわく、
「Asset bundles cannot include Editor Objects ~」は、対象とするオブジェクトがメモリ上のみでアセットとして存在しない時に発生します。
このエラー文ではアセットとして存在しないオブジェクトをエディタオブジェクトと呼んでいます。
とのこと。
つまりpredabがメモリ上のものでしかなく、それをAssetBundleにしようとしたのに駄目だった、ということをさすエラーだったわけだ。
対策
で、実際には処理として、prefabをファイルとして出力したものを読み込んで使用していたのだけれど、
それだけだと駄目で、prefabをファイルとして吐き出したあと、
UnityにAsset自体の情報を覚えてもらうメソッド
AssetDatabase.SaveAssets()
を実行する必要があった。という。
で、実行してみたらめっちゃうまく行った。
回避方法で実現していた内容の真相
これは実に示唆に富んでいる(って書くとカッコいい気がする)
回避方法のところで書いた通り、このエラーは「コマンドラインから再度動かすことで回避できる」ものだった。
つまり、Unity.exeの終了時に、Unityは自動でAssetDataBase.SaveAssets() メソッドを実行しているんだと思う。
それらを明示的に使用すればよい、という感じ。
謎が解けてよかった。